home *** CD-ROM | disk | FTP | other *** search
/ The Games Machine 165 / XENIATGM165.ISO / Goodies / Toca Race Driver Etoy / racedriver-etoy.exe / race_downloadable.dcr / Internal_89_catmull rom spline.ls < prev    next >
Encoding:
Text File  |  2002-08-16  |  2.4 KB  |  109 lines

  1. property pointList, stageDistances, stageLengths, numPoints, totalLength
  2.  
  3. on new me, i_img
  4.   pointList = []
  5.   stageDistances = []
  6.   return me
  7. end
  8.  
  9. on addPoint me, pointNumber, newloc, distance
  10.   pointList[pointNumber] = newloc
  11.   stageDistances[pointNumber] = distance
  12. end
  13.  
  14. on calcStats me
  15.   numPoints = pointList.count
  16.   totalLength = 0
  17.   i = 1
  18.   repeat while i <= numPoints
  19.     totalLength = totalLength + stageDistances[i]
  20.     i = 1 + i
  21.   end repeat
  22.   stageLengths = []
  23.   lengthSoFar = 0
  24.   i = 1
  25.   repeat while i <= numPoints
  26.     lengthSoFar = lengthSoFar + stageDistances[i]
  27.     stageLengths[i] = lengthSoFar
  28.     i = 1 + i
  29.   end repeat
  30. end
  31.  
  32. on calcCourseDistance me, lap, nodenum, nodetime
  33.   distance = (lap - 1) * totalLength
  34.   nodenum = nodenum - 1
  35.   if nodenum = 0 then
  36.     nodenum = numPoints
  37.   end if
  38.   distance = distance + (nodetime * stageDistances[nodenum])
  39.   nodenum = nodenum - 1
  40.   if nodenum then
  41.     distance = distance + stageLengths[nodenum]
  42.   end if
  43.   return distance
  44. end
  45.  
  46. on getBasis me, p, t
  47.   fresult = 0
  48.   case p of
  49.     (-2):
  50.       fresult = (((-t + 2) * t) - 1) * t / 2
  51.     (-1):
  52.       fresult = ((((3 * t) - 5) * t * t) + 2) / 2
  53.     0:
  54.       fresult = ((((-3 * t) + 4) * t) + 1) * t / 2
  55.     1:
  56.       fresult = (t - 1) * t * t / 2
  57.   end case
  58.   return fresult
  59. end
  60.  
  61. on getPoint me, i, t
  62.   resultPoint = point(0, 0)
  63.   j = -2
  64.   repeat while j <= 1
  65.     controlPointPos = i + j
  66.     if controlPointPos < 1 then
  67.       controlPointPos = controlPointPos + pointList.count
  68.     end if
  69.     if controlPointPos > pointList.count then
  70.       controlPointPos = controlPointPos - pointList.count
  71.     end if
  72.     resultPoint = resultPoint + (pointList[controlPointPos] * me.getBasis(j, t))
  73.     j = 1 + j
  74.   end repeat
  75.   return resultPoint
  76. end
  77.  
  78. on getDxBasis me, p, t
  79.   fresult = 0
  80.   case p of
  81.     (-2):
  82.       fresult = ((((-3 * t) + 4) * t) - 1) / 2.0
  83.     (-1):
  84.       fresult = ((9 * t) - 10) * t / 2.0
  85.     0:
  86.       fresult = ((((-9 * t) + 8) * t) + 1) / 2.0
  87.     1:
  88.       fresult = ((3 * t) - 2) * t / 2.0
  89.   end case
  90.   return fresult
  91. end
  92.  
  93. on getDxDyPoint me, i, t
  94.   resultPoint = point(0, 0)
  95.   j = -2
  96.   repeat while j <= 1
  97.     controlPointPos = i + j
  98.     if controlPointPos < 1 then
  99.       controlPointPos = controlPointPos + pointList.count
  100.     end if
  101.     if controlPointPos > pointList.count then
  102.       controlPointPos = controlPointPos - pointList.count
  103.     end if
  104.     resultPoint = resultPoint + (pointList[controlPointPos] * me.getDxBasis(j, t))
  105.     j = 1 + j
  106.   end repeat
  107.   return resultPoint
  108. end
  109.